ホームに戻る
出典 :
データ テンプレートの概要 - WPF | Microsoft Learn WPF4.5入門 その47 「コンテンツモデル」 - かずきのBlog@hatena WPF の DataTemplate を活用した MVVM パターンの実践 #WPF - Qiita 【WPF】DataTemplateSelectorクラスを使用して、動的にコントロールの種類を変更する方法【C#】 #Xaml - Qiita WPFのControlTemplateとDataTemplateの違い、それとContentPresenter - プログラム系統備忘録ブログ
関連 :
データバインディング MVVMパターン リソース スタイル ControlTemplate トリガー
目次 :

データ・テンプレート(DataTemplate)とは

コントロールの主に Content プロパティにオブジェクトが設定されている場合、どのようにそのオブジェクトを表示するかを定義する。 特にデータバインディングを行う場合に有効で、DataTemplate を定義しておくことで様々な型をソースとすることができるとともに、 ソースの型が同じ場合でも、異なる DataTemplate を割り当てることで表示方法を柔軟にカスタマイズすることができる。

DataTemplate の作用機構

WPFにおいてコントロールの表示は ContentControl クラスが担っており、これは「 Content プロパティに設定された単一の要素を表示する」という機能を提供する。 DataTemplate は、ContentControl が表示を決定する際の基準となる。
ロジックは複雑ではあるが、端的には
となる。Button や Label 、ListBoxItem は ContentControl を継承しているため、以下のような直感的な記述が可能である。
// Button に文字列を表示 : Content に文字列を設定 this.button.Content = "こんにちは世界"; // Button 内に Button を表示 ; Content に Button を設定 this.button.Content = new Button { Content = "ボタンの中のボタン" };

DataTemplate の適用対象

対象のコントロールが ContentControl 、ItemsControl のいずれから派生しているかによって、DataTemplate を割り当てるプロパティが異なる。 ItemsControl はコレクションをソースし、DataTemplate は ItemsControl 全体ではなく、コレクションの各項目に作用する。
対象のコントロール 割り当て先のプロパティ
ContentControl 派生
( Button 、Label など)
ContentTemplate
ItemsControl 派生
( ComboBox 、ListBox、DataGrid など)
ItemTemplate

DataTemplate の例

View : MainWindow.xaml
画像
Model : Person.cs
画像
画面表示
画像
ここでは解説のために ListBox 中に DataTemplate を定義しているが、リソースとして定義するほうが 再利用がしやすい。詳細は出典元を参照。

トリガー

DataTemplate にはトリガーを含めることができる。
Model : Person.cs
画像
View : MainWindow.xaml
画像
画面表示
画像

DateTemplateSelector

DateTemplateSelector は、条件に応じて DataTemplate を切り替える仕組みである。 複数の DataTemplate から条件に応じてひとつを選択する。
DateTemplateSelector の定義 : PersonDateTemplateSelector.cs
画像
ここでは、DateTemplateSelector として PersonDateTemplateSelector を定義している。 クラスは DateTemplateSelector を継承し、SelectTemplate() メソッドで適用する DataTemplate を返す。
View : MainWindow.xaml
画像
DataTemplate の候補である PersonTemplate1 、PersonTemplate2 は Window の Resource として定義している。 DateTemplateSelector の適用先は ListBox では ItemTemplateSelector となる( ItemTemplate ではない点に注意)。
画面表示
画像
PersonDateTemplateSelector の定義通り、Person.Age が 40 未満ならば PersonTemplate1 が、 それ以外は PersonTemplate2 が適用される。

ControlTemplateとの違い

いずれもコントロールの外見に作用するが、
ControlTemplate
コントロールのすべての要素に影響する
DataTemplate
コントロールの Content 以下の要素に影響する
という違いがある。 ControlTemplate には ContentPresenter を含めることができ、ContentPresenter の ContentTemplate プロパティに DataTemplate を割り当てた場合は コントロールの ContentTemplate プロパティに DataTemplate を割り当てた場合と同様の動作となる。 画像 このため、Content 以下の要素のみを制御するのであれば DataTemplate 、 ( Content を含めた)すべての要素を制御するのであれば ControlTemplate を用いることになる。